// 对于结构体(struct)和接口(interfaces)的 嵌入(embedding) 以表达一种更加无缝的 组合(composition) 类型
package main

import "fmt"

type base struct {
	num int
}

func (b base) describe() string {
	return fmt.Sprintf("base with num = %v", b.num)
}

// 在container内部嵌入了base
type container struct {
	base
	str string
}

func main() {
	//当创建含有嵌入的结构体，必须对嵌入进行显式的初始化
	co := container{
		base: base{num: 1},
		str:  "some name",
	}
	//可以直接在co上访问base中定义的字段
	fmt.Printf("co={num:%v,str:%v}\n", co.num, co.str)

	//或者可以使用嵌入的类型名拼出完整的路径
	fmt.Println("also num:", co.base.num)
	fmt.Println("describe:", co.describe())

	type describer interface {
		describe() string
	}

	var d describer = co
	fmt.Println("describer:", d.describe())
}
